13. 练习:维度
窗口为 3x3、stride 为 1 的卷积
图片来源: http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution
维度
和神经网络一样,我们按以下步骤在 Keras 中创建 CNN:首先创建一个
序列
模型。
使用
.add()
方法向该网络中添加层级。
将以下代码复制粘贴到叫做
conv-dims.py
的 Python 可执行文件中:
from keras.models import Sequential
from keras.layers import Conv2D
model = Sequential()
model.add(Conv2D(filters=16, kernel_size=2, strides=2, padding='valid',
activation='relu', input_shape=(200, 200, 1)))
model.summary()
我们不会训练该 CNN;相反,我们将使用该可执行文件根据所提供的参数研究卷积层的维度如何变化。
运行
python path/to/conv-dims.py
并查看输出。应该如下所示:
卷积层的维度符合你的期望吗?
你可以随意更改在
conv-dims.py
文件中为参数(
filters
、
kernel_size
等)分配的值。
注意卷积层中的
参数数量
是如何变化的。对应的是输出内容中的
Param #
下的值。在上图中,卷积层具有
80
个参数。
同时注意卷积层的
形状
是如何变化的。对应的是输出内容中的
Output Shape
下的值。在上图中,
None
对应的是批次大小,卷积层的高度为
100
,宽度为
100
,深度为
16
。
公式:卷积层中的参数数量
卷积层中的参数数量取决于
filters
、
kernel_size
和
input_shape
的值。我们定义几个变量:
-
K- 卷积层中的过滤器数量 -
F- 卷积过滤器的高度和宽度 -
D_in- 上一层级的深度
注意:
K
=
filters
,
F
=
kernel_size
。类似地,
D_in
是
input_shape
元组中的最后一个值。
因为每个过滤器有
F*F*D_in
个权重,卷积层由
K
个过滤器组成,因此卷积层中的权重总数是
K*F*F*D_in
。因为每个过滤器有 1 个偏差项,卷积层有
K
个偏差。因此,卷积层中的
参数数量
是
K*F*F*D_in + K
。
公式:卷积层的形状
卷积层的形状取决于
kernel_size
、
input_shape
、
padding
和
stride
的值。我们定义几个变量:
-
K- 卷积层中的过滤器数量 -
F- 卷积过滤器的高度和宽度 -
H_in- 上一层级的高度 -
W_in- 上一层级的宽度
注意:
K
=
filters
、
F
=
kernel_size
,以及
S
=
stride
。类似地,
H_in
和
W_in
分别是
input_shape
元组的第一个和第二个值。
卷积层的
深度
始终为过滤器数量
K
。
如果
padding = 'same'
,那么卷积层的空间维度如下:
-
height
= ceil(float(
H_in) / float(S)) -
width
= ceil(float(
W_in) / float(S))
如果
padding = 'valid'
,那么卷积层的空间维度如下:
-
height
= ceil(float(
H_in-F+ 1) / float(S)) -
width
= ceil(float(
W_in-F+ 1) / float(S))
练习
请更改
conv-dims.py
文件,使其如下所示:
from keras.models import Sequential
from keras.layers import Conv2D
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=3, strides=2, padding='same',
activation='relu', input_shape=(128, 128, 3)))
model.summary()
运行
python path/to/conv-dims.py
,并使用输出回答以下问题。